package com.njust.bean;

import com.njust.service.CarService;
import com.njust.service.UserService;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class IOCTest11 {

    private ConfigurableApplicationContext ioc;

    @Before
    public void tearUp(){
        ioc = new ClassPathXmlApplicationContext("config/ioc11.xml");
    }

    /**
     * 实验23：测试泛型依赖注入★
     * Spring中可以使用带泛型的父类来确定这个子类的类型
     */
    @Test
    public void test23(){
        System.out.println("========实验二十三========");
        CarService carService = ioc.getBean(CarService.class);
        UserService userService = ioc.getBean(UserService.class);
        carService.save();
        userService.save();

        System.out.println(carService.getClass());
        //父类类型：com.njust.service.BaseService
        System.out.println(carService.getClass().getSuperclass());
        //带泛型的父类类型：com.njust.service.BaseService<com.njust.bean.Car>
        System.out.println(carService.getClass().getGenericSuperclass());
        System.out.println(userService.getClass());
        System.out.println(userService.getClass().getSuperclass());
        System.out.println(userService.getClass().getGenericSuperclass());
        System.out.println("========结束========");
    }

    /**
     * 总结：ioc是一个容器，帮我们管理所有组件
     * 1、依赖注入；@Autowired；自动赋值
     * 2、某个组件要使用Spring提供的更多（IOC、AOP）必须加入到容器中；
     * 体会：
     * 1、容器启动。创建所有单实例bean
     * 2、autowired自动装配的时候，是从容器中找这些符合要求的bean
     * 3、ioc.getBean("bookServlet")；也是从容器中找到这个bean；
     * 4、容器中包括了所有的bean；
     * 5、调试spring的源码，容器到底是什么？其实就是一个map；
     * 6、这个map中保存所有创建好的bean，并提供外界获取功能...
     * 7、探索，单实例的bean都保存到哪个map中了。【源码-扩展】
     * 8、源码调试的思路；
     * 从helloworld开始的；给helloworld每一个关键步骤打上断点。进去看里面都做了什么工作？
     * 怎么知道哪些方法都是干什么的
     * 1、翻译这个方法是干什么？
     * 2、放行这个方法，看控制台,看debug的每一个变量的变化
     * 3、看方法注释；
     * 看源码学到的一点：1）、规范注释，   2）、规范方法名和类名;
     *        }
     */
}
